feat!: Restructure provider factory, add create methods, migrate to uv#102
Merged
jsonbailey merged 13 commits intomainfrom Mar 25, 2026
Merged
feat!: Restructure provider factory, add create methods, migrate to uv#102jsonbailey merged 13 commits intomainfrom
jsonbailey merged 13 commits intomainfrom
Conversation
dd194a8 to
fd13f66
Compare
fd13f66 to
4bef65c
Compare
Keep uv-based CI setup (drop poetry steps added in main), accept version bump to 0.16.1 from main while preserving x-release-please-version comment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat!: Rename AIProviderFactory → RunnerFactory feat!: Rename OpenAIProvider → OpenAIRunnerFactory import from ldai_openai.openai_runner_factory feat!: Rename LangChainProvider to LangChainRunnerFactory import from ldai_langchain.langchain_runner_factory feat: Add create_model(), create_agent(), create_agent_graph() to AIProvider ABC (non-abstract, default warns)
4bef65c to
e10be52
Compare
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
keelerm84
approved these changes
Mar 25, 2026
Resolve conflicts: - Makefiles (langchain, openai, server-ai): accept main's `uv sync --all-groups` over branch's `--group dev` to pick up the tooling update from main - client.py: keep branch's `RunnerFactory` import (the PR 1 rename) over main's stale `AIProviderFactory` import Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove module-level docstring strings from all modified files (not idiomatic Python) - Replace all "connector" terminology with "provider" in class docstrings, method docstrings, and log warning messages - Fix stale "ExecutorFactory" references in provider class docstrings → RunnerFactory - Add assert guards for Optional[BaseChatModel] before invocation in LangChainRunnerFactory to satisfy mypy - Fix trailing blank lines (W391) across modified files Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
packages/ai-providers/server-ai-openai/src/ldai_openai/openai_runner_factory.py
Outdated
Show resolved
Hide resolved
Completes the rename that was done for the file (openai_provider.py → openai_runner_factory.py) but missed the class itself. Updates all references in __init__.py, runner_factory.py, and tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop # --- AIProvider factory methods ---, # --- Model invocation ---, # --- Convenience accessors ---, and # --- Public API --- from the factory and provider classes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove stale PR 2 migration note from AIProvider docstring - Remove 'two ways' prose from runner factory class and __init__ docstrings - Replace log.warn with log.warning in ai_provider.py Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
packages/ai-providers/server-ai-langchain/src/ldai_langchain/langchain_runner_factory.py
Show resolved
Hide resolved
Merged
jsonbailey
added a commit
that referenced
this pull request
Apr 2, 2026
🤖 I have created a release *beep* *boop* --- <details><summary>launchdarkly-server-sdk-ai: 0.17.0</summary> ## [0.17.0](launchdarkly-server-sdk-ai-0.16.1...launchdarkly-server-sdk-ai-0.17.0) (2026-04-02) ### ⚠ BREAKING CHANGES * Bump minimum LangChain version to 1.0.0 * Split track_metrics_of into sync and async variants ([#112](#112)) * Remove node-scoped methods from AIGraphTracker (track_node_invocation, track_tool_call, track_node_judge_response), use related AIConfigTracker methods instead * Extract shared utilities to openai_helper * Extract shared utilities to langchain_helper * Restructure provider factory and support additional create methods ([#102](#102)) ### Features * Add get_ai_usage_from_response to openai_helper ([4fab18f](4fab18f)) * Add get_tool_calls_from_response and sum_token_usage_from_messages to langchain_helper ([4fab18f](4fab18f)) * Add LangGraphAgentGraphRunner ([56ce0fd](56ce0fd)) * Add LDAIClient.create_agent() returning ManagedAgent ([53fd95e](53fd95e)) * Add ManagedAgentGraph support ([#111](#111)) ([56ce0fd](56ce0fd)) * Add ModelRunner ABC with invoke_model() and ([453c71c](453c71c)) * Add OpenAIAgentGraphRunner ([56ce0fd](56ce0fd)) * Add OpenAIAgentRunner with agentic tool-calling loop ([53fd95e](53fd95e)) * add optimization package stub ([872e81e](872e81e)) * Add optional graph_key to all LDAIConfigTracker track_* methods for graph correlation ([4fab18f](4fab18f)) * Add track_tool_call/track_tool_calls to LDAIConfigTracker ([4fab18f](4fab18f)) * Adds optimization package stub ([58b7731](58b7731)) * Bump minimum LangChain version to 1.0.0 ([dc592c5](dc592c5)) * Deprecated Chat object in favor of ManagedModel ([453c71c](453c71c)) * Deprecated create_chat(), use create_model() on the LDAIClient ([453c71c](453c71c)) * Drop support for python 3.9 ([#114](#114)) ([dc592c5](dc592c5)) * Extract shared utilities to langchain_helper ([453c71c](453c71c)) * Extract shared utilities to openai_helper ([453c71c](453c71c)) * Introduce ManagedAgent and AgentRunner implementations ([#110](#110)) ([53fd95e](53fd95e)) * Introduce ManagedModel and ModelRunner (PR-3) ([#104](#104)) ([453c71c](453c71c)) * Restructure provider factory and support additional create methods ([#102](#102)) ([e6e4907](e6e4907)) * Split track_metrics_of into sync and async variants ([#112](#112)) ([4fab18f](4fab18f)) ### Bug Fixes * make AIGraphTracker.track_total_tokens accept Optional[TokenUsage], skip when None or total <= 0 ([4fab18f](4fab18f)) * Remove node-scoped methods from AIGraphTracker (track_node_invocation, track_tool_call, track_node_judge_response), use related AIConfigTracker methods instead ([4fab18f](4fab18f)) * use time.perf_counter_ns() for sub-millisecond precision in duration calculations ([4fab18f](4fab18f)) </details> <details><summary>launchdarkly-server-sdk-ai-langchain: 0.4.0</summary> ## [0.4.0](launchdarkly-server-sdk-ai-langchain-0.3.2...launchdarkly-server-sdk-ai-langchain-0.4.0) (2026-04-02) ### ⚠ BREAKING CHANGES * Bump minimum LangChain version to 1.0.0 * Split track_metrics_of into sync and async variants ([#112](#112)) * Remove node-scoped methods from AIGraphTracker (track_node_invocation, track_tool_call, track_node_judge_response), use related AIConfigTracker methods instead * Extract shared utilities to openai_helper * Extract shared utilities to langchain_helper * Restructure provider factory and support additional create methods ([#102](#102)) ### Features * Add get_ai_usage_from_response to openai_helper ([4fab18f](4fab18f)) * Add get_tool_calls_from_response and sum_token_usage_from_messages to langchain_helper ([4fab18f](4fab18f)) * Add LangGraphAgentGraphRunner ([56ce0fd](56ce0fd)) * Add LDAIClient.create_agent() returning ManagedAgent ([53fd95e](53fd95e)) * Add ManagedAgentGraph support ([#111](#111)) ([56ce0fd](56ce0fd)) * Add ModelRunner ABC with invoke_model() and ([453c71c](453c71c)) * Add OpenAIAgentGraphRunner ([56ce0fd](56ce0fd)) * Add OpenAIAgentRunner with agentic tool-calling loop ([53fd95e](53fd95e)) * add optimization package stub ([872e81e](872e81e)) * Add optional graph_key to all LDAIConfigTracker track_* methods for graph correlation ([4fab18f](4fab18f)) * Add track_tool_call/track_tool_calls to LDAIConfigTracker ([4fab18f](4fab18f)) * Adds optimization package stub ([58b7731](58b7731)) * Bump minimum LangChain version to 1.0.0 ([dc592c5](dc592c5)) * Deprecated Chat object in favor of ManagedModel ([453c71c](453c71c)) * Deprecated create_chat(), use create_model() on the LDAIClient ([453c71c](453c71c)) * Drop support for python 3.9 ([#114](#114)) ([dc592c5](dc592c5)) * Extract shared utilities to langchain_helper ([453c71c](453c71c)) * Extract shared utilities to openai_helper ([453c71c](453c71c)) * Introduce ManagedAgent and AgentRunner implementations ([#110](#110)) ([53fd95e](53fd95e)) * Introduce ManagedModel and ModelRunner (PR-3) ([#104](#104)) ([453c71c](453c71c)) * Restructure provider factory and support additional create methods ([#102](#102)) ([e6e4907](e6e4907)) * Split track_metrics_of into sync and async variants ([#112](#112)) ([4fab18f](4fab18f)) ### Bug Fixes * make AIGraphTracker.track_total_tokens accept Optional[TokenUsage], skip when None or total <= 0 ([4fab18f](4fab18f)) * Remove node-scoped methods from AIGraphTracker (track_node_invocation, track_tool_call, track_node_judge_response), use related AIConfigTracker methods instead ([4fab18f](4fab18f)) * use time.perf_counter_ns() for sub-millisecond precision in duration calculations ([4fab18f](4fab18f)) </details> <details><summary>launchdarkly-server-sdk-ai-openai: 0.3.0</summary> ## [0.3.0](launchdarkly-server-sdk-ai-openai-0.2.1...launchdarkly-server-sdk-ai-openai-0.3.0) (2026-04-02) ### ⚠ BREAKING CHANGES * Bump minimum LangChain version to 1.0.0 * Extract shared utilities to openai_helper * Extract shared utilities to langchain_helper * Restructure provider factory and support additional create methods ([#102](#102)) ### Features * Add LangGraphAgentGraphRunner ([56ce0fd](56ce0fd)) * Add LDAIClient.create_agent() returning ManagedAgent ([53fd95e](53fd95e)) * Add ManagedAgentGraph support ([#111](#111)) ([56ce0fd](56ce0fd)) * Add ModelRunner ABC with invoke_model() and ([453c71c](453c71c)) * Add OpenAIAgentGraphRunner ([56ce0fd](56ce0fd)) * Add OpenAIAgentRunner with agentic tool-calling loop ([53fd95e](53fd95e)) * add optimization package stub ([872e81e](872e81e)) * Adds optimization package stub ([58b7731](58b7731)) * Bump minimum LangChain version to 1.0.0 ([dc592c5](dc592c5)) * Deprecated Chat object in favor of ManagedModel ([453c71c](453c71c)) * Deprecated create_chat(), use create_model() on the LDAIClient ([453c71c](453c71c)) * Drop support for python 3.9 ([#114](#114)) ([dc592c5](dc592c5)) * Extract shared utilities to langchain_helper ([453c71c](453c71c)) * Extract shared utilities to openai_helper ([453c71c](453c71c)) * Introduce ManagedAgent and AgentRunner implementations ([#110](#110)) ([53fd95e](53fd95e)) * Introduce ManagedModel and ModelRunner (PR-3) ([#104](#104)) ([453c71c](453c71c)) * Restructure provider factory and support additional create methods ([#102](#102)) ([e6e4907](e6e4907)) </details> <details><summary>launchdarkly-server-sdk-ai-optimization: 0.1.0</summary> ## 0.1.0 (2026-04-02) ### ⚠ BREAKING CHANGES * Bump minimum LangChain version to 1.0.0 ### Features * Add optimization package stub ([#109](#109)) ([ebd5166](ebd5166)) * Adds optimization package stub ([58b7731](58b7731)) * Adds optimization package stub ([cc85a05](cc85a05)) * Bump minimum LangChain version to 1.0.0 ([dc592c5](dc592c5)) * Drop support for python 3.9 ([#114](#114)) ([dc592c5](dc592c5)) ### Bug Fixes * consistency with other makefiles ([b9a5601](b9a5601)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk because this PR only updates release metadata (versions, manifests, provenance docs, and changelogs) without changing runtime code paths. > > **Overview** > Bumps package versions for the release: `launchdarkly-server-sdk-ai` to `0.17.0`, LangChain provider to `0.4.0`, OpenAI provider to `0.3.0`, and introduces/bumps `launchdarkly-server-sdk-ai-optimization` to `0.1.0` (via `.release-please-manifest.json` and each package’s `pyproject.toml`/`__init__.__version__`). > > Updates `CHANGELOG.md` entries and `PROVENANCE.md` version references to match the new release numbers. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit ae3e183. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: jsonbailey <jbailey@launchdarkly.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Requirements
Related issues
Provide links to any issues in this repository or elsewhere relating to this pull request.
Describe the solution you've provided
This PR contains two major changes:
1. Provider factory restructuring (breaking)
feat!: RenameOpenAIProvider→OpenAIRunnerFactory; renameopenai_provider.py→openai_runner_factory.pyfeat!: RenameLangChainProvider→LangChainRunnerFactory; renamelangchain_provider.py→langchain_runner_factory.pyfeat!: Remove abstract staticcreate(ai_config)fromAIProviderABC; see newcreate_[model|agent|agent_graph]feat: Addcreate_model(),create_agent(),create_agent_graph()instance methods toAIProviderABC (non-abstract, default warns)feat!: ReplaceAIProviderFactorywithRunnerFactory; deleteai_provider_factory.pyfeat:RunnerFactory.create_model/agent/agent_graph()replace asyncAIProviderFactory.create()fix:LDClientnow callsRunnerFactory.create_model()synchronously instead of awaitingAIProviderFactory.create()2. Poetry → uv migration
pyproject.tomlto a uv workspace configurationpoetry-coretohatchling(langchain and openai provider packages)uv run/uv sync/uv build.github/workflows/ci.yml,release-please.yml) to useastral-sh/setup-uvinstead ofactions/setup-python+abatilo/actions-poetry.github/actions/ci/action.yml) accordinglyCONTRIBUTING.mdwith uv-based setup instructions.gitignore(poetry.lock→uv.lock, add.venv/)Describe alternatives you've considered
Provide a clear and concise description of any alternative solutions or features you've considered.
Additional context
Items for reviewer attention
OpenAI import name inconsistency — In
runner_factory.py, the LangChain connector is imported asLangChainRunnerFactory, but the OpenAI connector is still imported asOpenAIProvider. Verify this is intentional and matches the actual export fromldai_openai/__init__.py.CI action
uv sync --all-groupswithout workspace_path — The old CI action ranpoetry installscoped toinputs.workspace_path. The new action runsuv sync --all-groupsat the repo root (workspace-level). Confirm this correctly installs deps for the specific package being tested, and doesn't mask missing dependency declarations.Release workflow changes —
release-please.ymlremoves all explicitactions/setup-pythonandabatilo/actions-poetrysteps, relying on the composite CI action to set up uv. Verify the build/publish steps still produce correct distribution artifacts with hatchling instead of poetry-core.uv.locknot committed —.gitignoreexcludesuv.lock, which is appropriate for libraries but means CI won't have reproducible installs. This is a deliberate tradeoff documented in the gitignore comment.Note
Medium Risk
Introduces a breaking API rename and changes provider instantiation/creation flow, which can affect downstream integrations and runtime provider selection. Also adds new factory entry points (
create_agent,create_agent_graph) that are currently provider-dependent and may returnNoneif unsupported.Overview
Replaces
AIProviderFactorywith a newRunnerFactorythat centralizes provider loading, fallback selection, and capability construction viacreate_model,create_agent, andcreate_agent_graph.Refactors the provider interface:
AIProvidernow acts as a per-provider factory with non-abstractcreate_*methods (defaulting to warnings/None), and the SDK client now usesRunnerFactory.create_modelwhen creating chats and judges.Updates the OpenAI and LangChain provider packages to expose
OpenAIRunnerFactory/LangChainRunnerFactoryand implement instancecreate_model(removing the async staticcreate), including OpenAI client reuse/auto-creation and corresponding test updates.Written by Cursor Bugbot for commit 22f67de. This will update automatically on new commits. Configure here.
Link to Devin session: https://app.devin.ai/sessions/7d5bda4d9dbe4ae0b950b30a50485e60
Requested by: @keelerm84